<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>vue学习使用</title>
  <!-- 第1步： 引入vue库文件 -->
  <script src="./js/vue.js"></script>
</head>

<body>
  <!-- 第2步：挂载点 -->
  <div id="app">

    <div>
      <input type="text" v-model="username">
      <span>{{errorUsername}}</span>
      <hr>
      <input type="number" v-model.number="user.id">
    </div>

  </div>

  <!-- 第3步：实例化vue -->
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        username: 'aaa',
        errorUsername: '',
        user: { id: 100, name: 'aaa' }
      },
      // 监听器，它用来监听data配置中的数据的变化，一但有变化，就会自动触发，默认情况，初始化不触发
      // 在监听器中是可以得到this对象的
      // 监听器它的依赖项，只有一个，一对一
      // 监听器中可以写异步
      watch: {
        // 方法名或属性名 就是你要观察的data中的属性名称
        // 标准写法
        // username: {
        //   // 变化后的值，变化前的值
        //   handler(newValue, oldValue) {
        //     console.log(newValue, oldValue);
        //     if (newValue.length >= 3) this.errorUsername = '账号过长'
        //     else this.errorUsername = ''
        //   },
        //   // 初始时，执行1次 --- 一般情况下，不启用  只有在标准写法下面，才有此配置
        //   immediate: true
        // }
        // 简写
        // username(newValue, oldValue) {
        //   if (newValue.length >= 3) this.errorUsername = '账号过长'
        //   else this.errorUsername = ''
        //   // setTimeout(() => {
        //   //   this.errorUsername = '账号过长'
        //   // }, 1000);
        // }
        // 监听对象中的指定的属性数据的变化  推荐如果你监听的是一个对象中数据变化，建议这样的方式
        // 'user.id'(newValue, oldValue){
        //   console.log(newValue, oldValue);
        // }
        // 监听对象,只能使用标准方式来写
        // 监听对象变化，它的前后值是一样的，无法区分
        user: {
          // 深度监听
          deep: true,
          handler(newValue, oldValue) {
            console.log(newValue, oldValue);
          },
        }
      }
    })
  </script>

</body>

</html>